package com.core;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.exceptions.TooManyResultsException;
import tk.mybatis.mapper.entity.Condition;

import java.util.List;

/**
 * Service 层 基础接口，其他Service 接口 请继承该接口
 */
public interface BaseBiz<T> {
    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     *
     * @param model
     *
     */
    void save(T model);
    /**
     * 批量插入
     *
     * @param models
     *
     */
    void save(List<T> models);
    /**
     * 根据主键字段进行删除，方法参数必须包含完整的主键属性
     * @param id
     */
    void deleteById(Integer id);//通过主鍵刪除
    /**
     * 根据主键字符串进行删除，类中只有存在一个带有@Id注解的字段
     * @param ids  eg：ids -> “1,2,3,4”
     */
    void deleteByIds(String ids);
    /**
     * 根据条件删除
     *
     * @param cond
     *
     */
    public int deleteByCond(Object cond);

    /**
     * 根据主键更新实体全部字段，null值不会被更新
     * @param model
     */

    void update(T model);
    /**
     * 根据条件更新
     *
     * @param statement
     * @param c
     * @throws BaseException
     */
    public int updateByCond(@Param("record") T record, @Param("example") Object cond);
    /**
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     * @param id
     */
    T findById(Integer id);
    /**
     * 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
     * @param fieldName 字段名
     * @param value   值
     */
    T findBy(String fieldName, Object value) throws TooManyResultsException; //通过Model中某个成员变量名称（非数据表中column的名称）查找,value需符合unique约束
    /**
     * 根据主键字符串进行查询，类中只有存在一个带有@Id注解的字段
     * @param ids eg：ids -> “1,2,3,4”
     */
    List<T> findByIds(String ids);
    /**
     * 根据条件查找
     * @param cond 条件
     */
    List<T> findByCondition(Condition cond);
    /**
     * 查询全部结果
     *
     */
    List<T> findAll();
    int countByCond(Condition cond);
}
